/**
 * From 和 Into 两个 trait 是内在地联系着的，事实上这是它们的实现的重要 部分：
 * 如果能把类型 A 转换成类型 B，那么很容易相信我们也能把类型 B 转换成类型 A。
 */
use std::convert::From;

#[derive(Debug)]
struct Number {
    value: i32,
}
/// From trait 允许一种类型定义 “怎么根据另一种类型生成自己”，因此它提供了一种 类型转换的简单机制。
/// 在标准库中有无数 From 的实现，规定了原生类型及其他常见类 型的转换功能。
impl From<i32> for Number {
    fn from(item: i32) -> Self {
        Number { value: item }
    }
}
/// Into trait 就是把 From trait 倒过来而已。也就是说，如果你为你的类型实现了 From，那么同时你也就免费获得了 Into。
/// 使用 Into trait 通常要求指明要转换到的类型，因为编译器大多数时候不能推断它。不 过考虑到我们免费获得了 Into，这点代价不值一提。
pub fn test() {
    let str_a = "hello";
    let string_a = String::from(str_a);

    let num = Number::from(30);
    let int = 5;
    let no: Number = int.into();
    println!("{:?} {:?}", num, no);
}
